package com.ypj.indusynergyems.controller;

import com.ypj.indusynergyems.annotation.LogOperator;
import com.ypj.indusynergyems.common.convention.result.Result;
import com.ypj.indusynergyems.common.convention.result.Results;
import com.ypj.indusynergyems.dao.entity.MenuEntity;
import com.ypj.indusynergyems.service.IMenuService;
import com.ypj.indusynergyems.toolkit.MenuUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("/system/menu")
@RequiredArgsConstructor
@Slf4j
public class MenuController {

    private final IMenuService menuService;

    @GetMapping("/list")
    public String findAllMenu(Model model){
        //1.查询所有菜单列表
        List<MenuEntity> lists = menuService.findAllMenu();
        //2.获取一级菜单  二级菜单  三级菜单保存到model中
        model.addAttribute("topMenus", MenuUtils.getTopMenus(lists));
        model.addAttribute("secondMenus", MenuUtils.getSecondMenus(lists));
        model.addAttribute("thirdMenus", MenuUtils.getThirdMenus(lists));
        return "/system/menu/list";
    }

    /**
     * 显示菜单添加界面
     */
    @GetMapping("/add")
    public String showMenu(Model model){
        //1.查询所有菜单列表
        List<MenuEntity> lists = menuService.findAllMenu();
        //2.获取一级菜单  二级菜单 保存到model中
        model.addAttribute("topMenus", MenuUtils.getTopMenus(lists));
        model.addAttribute("secondMenus", MenuUtils.getSecondMenus(lists));
        return "/system/menu/add";
    }

    /**
     * 添加菜单
     */
    @PostMapping("/add")  //url 参数为实体对象
    @LogOperator(action = "添加一个菜单")  //自定义注解，提供了一个操作描述，用于在日志中记录调用的具体操作
    public @ResponseBody Result<Void> addMenu(MenuEntity menu){
        log.info("=======添加菜单，方法入参，menu={}=====",menu);
        menuService.addMenu(menu);
        return Results.success();
    }

    /**
     *编辑
     */
    @GetMapping("/edit/{id}")
    public String showEditMenu(@PathVariable("id")int menuId,Model model){
        log.info("=======显示编辑菜单页面，方法入参，menuId={}=====",menuId);
        //1.查询所有菜单列表
        List<MenuEntity> lists = menuService.findAllMenu();
        //2.获取一级菜单  二级菜单 保存到model中
        model.addAttribute("topMenus", MenuUtils.getTopMenus(lists));
        model.addAttribute("secondMenus", MenuUtils.getSecondMenus(lists));
        //3.根据菜单id查询菜单详情
        MenuEntity menu =  menuService.findMenuDetail(menuId);
        model.addAttribute("menu",menu);
        return "system/menu/edit";
    }

    //修改菜单
    @PutMapping("/edit")  //url
    @LogOperator(action = "编辑一个菜单")  //自定义注解，提供了一个操作描述，用于在日志中记录调用的具体操作
    public @ResponseBody Result<Void> editMenu(MenuEntity menu){
        log.info("=======编辑菜单，方法入参，menu={}=====",menu);
        menuService.editMenu(menu);
        return Results.success();
    }

    /**
     * 删除菜单
     */
    //删除菜单
    @DeleteMapping("/delete")   //普通url的写法
    @LogOperator(action = "删除一个菜单")  //自定义注解，提供了一个操作描述，用于在日志中记录调用的具体操作
    public @ResponseBody String deleteMenu(@RequestParam("id") int menuId){
        log.info("=======删除菜单，方法入参，menuId={}=====",menuId);
        return menuService.deleteMenu(menuId);
    }
}
